﻿# -*- codeing = utf-8 -*-
# @Time: 2021/10/17 12:58
# @Author: Ivan
# @File: 17-继承.py
# @Software: PyCharm

class Animal:
    def eat(self):
        print('吃')

    def drink(self):
        print('喝')

    def run(self):
        print('跑')

    def sleep(self):
        print('睡')

    def __pri_method(self):
        print('Animal的私有方法')

# 子类(派生类)拥有父类(基类)所有的属性和方法
class Dog(Animal):
    def bark(self):
        print('汪汪叫')

# 继承具有传递性，XiaoTianQuan类具有Dog类的属性和方法，也具有Animal类的属性和方法
# 子类不能访问父类的私有属性、私有方法，但是可以通过调用父类的公有方法调用父类的私有属性、私有方法
class XiaoTianQuan(Dog):
    def fly(self):
        print('哮天犬会飞')

    # 父类的方法不能满足子类的需要，子类可以重写父类的方法
    def bark(self):
        # 子类自己的方法实现
        print('神狗叫法不一样')
        # 调用父类的方法
        super().bark()

class Cat(Animal):
    def catch(self):
        print('抓老鼠')


# wangcai = Dog()
# wangcai.eat()
# wangcai.drink()
# wangcai.run()
# wangcai.sleep()
# wangcai.bark()

# xtq = XiaoTianQuan()
# xtq.bark()
# xtq.eat()


class A:
    def test(self):
        print('A --- test')

class B:
    def test(self):
        print('B --- test')

# 多继承时若父类有相同的方法，子类从前至后依次寻找父类的方法
# 多继承时应避免父类包含相同的方法
class C(A, B):
    pass

c = C()
c.test()
# 解释器顺序
print(C.__mro__)
# <class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>

